//唐崇展、曾凡诚
#ifndef SIMULATOR_H
#define SIMULATOR_H

#include <QObject>
#include "Component/ComponentParam.h"
#include "SystemState.h"
#include <QVector>
#include <QMap>
#include "Data/DataManager.h" // 包含数据管理类头文件

// 前向声明Scheduler类（替代直接包含头文件，避免循环引用）
class Scheduler;

class Simulator : public QObject
{
    Q_OBJECT

private:
    int globalTime = 0; // 当前仿真时间
    Scheduler* scheduler; // 修改：将Scheduler栈对象改为指针（用于传入Simulator实例，需手动释放）
     DataManager* dataMgr;
    // 移除：不再使用ScheduleResult，删除结果存储容器
    // std::vector<ScheduleResult> results; // 存储仿真结果

public:


    // 【硬编码参数改为成员变量】设置默认值（兼容原有逻辑）
    float dieselGenMaxPower = 100.0f;   // 柴油最大出力（示例默认100kW）
    float dieselGenMinPower = 20.0f;    // 柴油最小出力（示例默认20kW）
    float dieselCostPerKwh = 1.2f;      // 柴油成本（示例默认1.2元/kWh）
    float energyStorageCapacity = 100.0f;// 储能容量（示例默认100kWh）

    Scheduler* getScheduler() const { return scheduler; }
    SystemState currentState; // 当前系统状态
    explicit Simulator(QObject* parent = nullptr);
    ~Simulator(); // 新增：析构函数（用于释放Scheduler指针，避免内存泄漏）

    // -------------------------- 原有：映射表（保持不变） --------------------------
    //存储从 DataManager 接收的“时间→功率/价格”映射
    QMap<int, float> dieselGenTimePowerMap;
    QMap<int, float> pvTimePowerMap; // 光伏的“时间-功率”映射
    QMap<int, float> energyStorageTimePowerMap; // 储能的“时间-功率”映射
    QMap<int, float> loadTimePowerMap; // 负载的“时间-功率”映射
    QMap<int, float> gridTimePowerMap; // 电网的“时间-功率”映射
    QMap<int, float> gPriceTimePriceMap; // 新增：电价的“时间-价格”映射

    // 【参数读取接口】给UI回显当前值用
    float getDieselGenMaxPower() const { return dieselGenMaxPower; }
    float getDieselGenMinPower() const { return dieselGenMinPower; }
    float getDieselCostPerKwh() const { return dieselCostPerKwh; }
    float getEnergyStorageCapacity() const { return energyStorageCapacity; }

    // 【参数修改接口】接收UI传来的新值
    void setDieselGenMaxPower(float val) { dieselGenMaxPower = val; }
    void setDieselGenMinPower(float val) { dieselGenMinPower = val; }
    void setDieselCostPerKwh(float val) { dieselCostPerKwh = val; }
    void setEnergyStorageCapacity(float val) { energyStorageCapacity = val; }

public slots:
    // 修改：启动仿真默认步长改为3600秒（1小时，适配0-23时间步逻辑）
    void startSimulation(int stepSec = 3600);
    void setInitialParams(const QList<ComponentParam>& params); // 初始化参数
    void advanceTimeStep(); // 推进时间步
    void backTimeStep(); // 修正注释：回退时间步（原注释错误）

    // -------------------------- 原有：数据接收槽函数（保持不变） --------------------------
    // 接收 DataManager 发来的各组件时间-功率/价格数据
    void onDieselGenTimePowerLoaded(QMap<int, float> timeToPower);
    void onPvDataLoaded(const QMap<int, float> pvTimePower);
    void onEnergyStorageDataLoaded(const QMap<int, float>& esTimePower);
    void onLoadDataLoaded(const QMap<int, float>& loadTimePower);
    void onGridDataLoaded(const QMap<int, float>& gridTimePower);
    void onGPriceDataLoaded(const QMap<int, float>& gPriceTimePrice); // 新增：接收电价数据

signals:
    void simulationStepAdvanced(int currentTime); // 仿真时间推进

public:
    // 原有：获取当前仿真时间（保持不变）
    int getCurrentTime() const;

    // 移除：不再使用ScheduleResult，删除结果获取接口
    // const std::vector<ScheduleResult>& getResults() const;

    // 原有：初始化系统状态（保持不变）
    void initializeSystem();
};

#endif // SIMULATOR_H
